假如你在尋找一個方法的具體實作, 必須在這方法的類別階層裡上上下下尋找.
這種階層稱為Yo-Yo Hierarchies
假設有個畫板應用程式, 其中一項圖案是長方形類別 Rectangle, 他目前有多種子類別繼承來Draw不同的繪畫功能
abstract class Rectangle
{
public abstract void Draw();
}
class BaseRectangle : Rectangle
{
public override void Draw()
{
//...
}
}
class DraggableRectangle : BaseRectangle
{
public override void Draw()
{
//...
}
}
class OrientationRectangle : DraggableRectangle
{
public override void Draw()
{
//...
}
}
class ColorRectangle : OrientationRectangle
{
public override void Draw()
{
//...
}
}
class LoggedRectangle : ColorRectangle
{
public override void Draw()
{
//...
}
}
class RealRectangle : LoggedRectangle
{
public override void Draw()
{
//...
}
}
上述的長方形, 其實每種特性應該是要獨立出來, 而不是用繼承.
因此, 可建立一個IRectangle 介面, 而需要新功能的則是用裝飾者(decorator)
interface IRectangle
{
void Draw();
}
abstract class Rectangle : IRectangle
{
}
class DraggableRectangleDecorator : IRectangle
{
public void Draw()
{
//...
}
}
class OrientationRectangleDecorator : IRectangle
{
public void Draw()
{
//...
}
}
class ColorRectangleDecorator : IRectangle
{
public void Draw()
{
//...
}
}
class LoggedRectangleDecorator : IRectangle
{
public void Draw()
{
//...
}
}
class RealRectangle : IRectangle
{
public void Draw()
{
//...
}
}
經過這種重構, 每個特性幾乎平行, 需要找具體實作會很容易
太深的繼承階層, 使程式碼的重複使用與可讀性降低.
不重構只會讓階層更高耦合、低內聚.